package com.kk.xhr.model.service;

import com.kk.xhr.common.pojo.ApplyStatusEnum;
import com.kk.xhr.model.dto.ApplyQueryRequestDTO;
import com.kk.xhr.model.dto.ComplementSignDTO;
import com.kk.xhr.model.dto.PageDto;
import com.kk.xhr.model.dto.SignDTO;
import com.kk.xhr.model.dto.SignQueryRequestDTO;
import org.apache.commons.lang3.tuple.Pair;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.Set;

/**
 * 签到服务接口
 *
 * @author luokexiong
 * @version 1.0 2021/2/19
 * @since 1.0.0
 */
public interface ISignService {

    /**
     * 分页查询签到列表
     *
     * @param dto SignQueryRequestDTO
     * @return SignDTO
     */
    PageDto<SignDTO> query(SignQueryRequestDTO dto);

    /**
     * 分页查询补签申请列表
     *
     * @param userId 用户id
     * @param dto    申请查询dto
     * @return ComplementSignDTO
     */
    PageDto<ComplementSignDTO> query(Long userId, ApplyQueryRequestDTO dto);

    /**
     * 查询某天最新一条签到记录
     *
     * @param userId 用户id
     * @param begin  开始时间
     * @return 签到dto
     */
    Optional<SignDTO> query(Long userId, LocalDate begin);

    /**
     * 根据主键id查询签到信息
     *
     * @param id 主键id
     * @return SignDTO
     */
    Optional<SignDTO> queryById(Long id);

    /**
     * 根据主键id查询补签记录
     *
     * @param id 主键id
     * @return ComplementSignDTO
     */
    Optional<ComplementSignDTO> queryComplementById(Long id);

    /**
     * 查询一周考勤情况
     *
     * @param mon 上周一
     * @param sun 上周日
     * @return 大小为7的list
     */
    List<Long> queryWeekSign(LocalDateTime mon, LocalDateTime sun);

    /**
     * 查询当天签到的用户id
     *
     * @return
     */
    Set<Long> queryDaySigned(LocalDate now);

    /**
     * 查询上个月所有考勤记录并计算时长
     *
     * @param userId 用户id
     * @param mouth  上个月第一天和最后一天
     * @return 上个月出勤总时长(小时)和缺失时间(分钟)
     */
    Pair<Long, Long> queryMouthSign(Long userId, Pair<LocalDateTime, LocalDateTime> mouth);

    /**
     * 添加签到记录
     *
     * @param dto SignDTO
     * @return 是否成功
     */
    boolean add(SignDTO dto);

    /**
     * 添加补签记录
     *
     * @param dto ComplementSignDTO
     * @return 是否成功
     */
    boolean addComplement(ComplementSignDTO dto);

    /**
     * 修改签到记录
     *
     * @param dto SignDTO
     * @return 是否成功
     */
    boolean modify(SignDTO dto);

    /**
     * 修改补签状态
     *
     * @param id     主键id
     * @param status 补签状态
     * @return 是否成功
     */
    boolean modifyComplementStatus(Long id, ApplyStatusEnum status);
}
